package com.example.demo;

import java.util.ArrayList;
import java.util.List;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.FileOutConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

/**
 * mybatis plus代码生成器
 * 
 * @ClassName: CodeGenerator
 * @Description:
 * @Author java
 * @DateTime 2020年2月8日 下午4:05:39
 */
public class CodeGenerator {

	public static void main(String[] args) {
		// 代码生成器
		AutoGenerator generator = new AutoGenerator();
		
		// 全局配置
		GlobalConfig gc = new GlobalConfig();
		
		String projectPath = System.getProperty("user.dir"); // 当前项目
		gc.setOutputDir(projectPath + "/src/main/java"); // 输出路径
		//gc.setOutputDir("/Users/gujiachun/Downloads");
		
		gc.setFileOverride(true);
		gc.setActiveRecord(false);// 不需要ActiveRecord特性的请改为false
		
		gc.setEnableCache(false);// XML 二级缓存
		gc.setBaseResultMap(true);// XML ResultMap
		gc.setBaseColumnList(true);// XML columList
		gc.setSwagger2(true);
		gc.setAuthor("java");// 作者

		// 自定义文件命名，注意 %s 会自动填充表实体属性！
		gc.setControllerName("%sController");
		//gc.setEntityName("%sEntity"); // 实体后缀名
		gc.setServiceName("%sService");
		gc.setServiceImplName("%sServiceImpl");
		gc.setMapperName("%sMapper");
		gc.setXmlName("%sMapper");
		generator.setGlobalConfig(gc);

		// 数据源配置
		DataSourceConfig dsc = new DataSourceConfig();
		dsc.setDbType(DbType.MYSQL);
		// com.mysql.jdbc.Driver com.mysql.cj.jdbc.Driver
		dsc.setDriverName("com.mysql.cj.jdbc.Driver");
		dsc.setUsername("iagent");
		dsc.setPassword("1zwE0GHbJR");
		dsc.setUrl("jdbc:mysql://mdb.sit.ptcloud.t.home:3306/iagent?allowMultiQueries=true&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false");
		generator.setDataSource(dsc);

		// 配置模板
		TemplateConfig tc = new TemplateConfig();
//		// tc.setEntity("templates/entity.java");//使用自定义模板生成实体类，可参考jar包中默认的模版
		tc.setXml("");// 不需要默认的生成xml，下面有定制路径
//		tc.setController("");// 不需要生成controller
		generator.setTemplate(tc);

		// 策略配置
		// 数据库表配置
		StrategyConfig sc = new StrategyConfig();
		sc.setCapitalMode(false); // 是否大写命名 默认false
		
		sc.setSkipView(true); // 是否跳过试图 默认false
		sc.setNaming(NamingStrategy.underline_to_camel);// 表映射 驼峰命名
		sc.setColumnNaming(NamingStrategy.underline_to_camel); // 字段映射 驼峰
		sc.setTablePrefix("t_");
		//sc.setEntityLombokModel(true); // 是否使用lombak 默认为false
		sc.setRestControllerStyle(true); // 默认false
		//sc.setSuperEntityClass(BaseDO.class);// 实体类的继承哪个类
		//sc.setSuperServiceImplClass(BaseDO.class)
		sc.setEntitySerialVersionUID(true); // 默认true
		sc.setEntityColumnConstant(true); // 默认false 将mysql字段名生成静态变量
		sc.setInclude("t_agent_testdrive"); // 表名，用，隔开 需要生产
		// sc.setExclude(""); // 不需要生成 二选一
		//sc.setEntityTableFieldAnnotationEnable(false); // 默认false 注释
		//sc.setControllerMappingHyphenStyle(false); // 默认false
		// sc.setLogicDeleteFieldName("status"); // 逻辑删除字段名称
		generator.setStrategy(sc);

		/**
		 * 将mapper.xml生成到resource下面
		 */
		String templatePath = "/templates/mapper.xml.vm"; // Velocity模板
		// 自定义配置
		InjectionConfig cfg = new InjectionConfig() {
			@Override
			public void initMap() {
				// to do nothing
			}
		};
		// 自定义输出配置
		List<FileOutConfig> focList = new ArrayList<>();
		// 自定义配置会被优先输出
		focList.add(new FileOutConfig(templatePath) {
			@Override
			public String outputFile(TableInfo tableInfo) {
				// 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
				return projectPath + "/src/main/resources/mapper/"
//                        + pc.getModuleName()
						+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
			}
		});
		cfg.setFileOutConfigList(focList);
		generator.setCfg(cfg);

		// 包配置
		PackageConfig pc = new PackageConfig();
		pc.setParent("com.example.demo");
		pc.setController("controller");
		pc.setService("service");
		pc.setServiceImpl("service.impl");
		pc.setMapper("dao");
		pc.setEntity("model");
		generator.setPackageInfo(pc);

		// 执行生成
		generator.execute();
	}
}
